﻿
#include "kfile.h"

#include <filesystem>
#include <fstream>
#include <iostream>
#include <sstream>

namespace ikit {

std::string replace_suffix_extension(const std::string& originalPath,
    std::string_view suffix, std::string_view newExtension) {
  // 检查 suffix 和 newExtension 是否同时为空
  if (suffix.empty() && newExtension.empty()) {
    throw std::invalid_argument(
        "At least one of 'suffix' or 'newExtension' must be non-empty.");
  }

  // 使用 std::filesystem::path 来解析路径
  std::filesystem::path path(originalPath);

  // 获取文件名（不包含扩展名）
  std::string filename = path.stem().string();

  // 获取原始扩展名
  std::string originalExtension = path.extension().string();

  // 修改文件名和扩展名
  std::string newFilename =
      suffix.empty() ? filename : (filename + std::string(suffix));
  std::string newExtensionStr =
      newExtension.empty() ? originalExtension : std::string(newExtension);

  // 重新组合路径
  std::filesystem::path newPath =
      path.parent_path() / (newFilename + newExtensionStr);

  // 返回修改后的路径
  return newPath.string();
}

std::string read_txt_file(const char* filename) {
  auto str_name = std::string(filename);
  std::ifstream file(str_name); // 创建输入文件流对象
  if (!file.is_open()) {
    throw std::runtime_error("Could not open file: " + str_name);
  }

  std::stringstream buffer; // 创建一个字符串流缓冲区
  buffer << file.rdbuf();   // 将文件内容读入缓冲区

  file.close(); // 关闭文件

  return buffer.str(); // 将缓冲区内容转换为字符串并返回
}

std::string get_current_dir() {
  std::filesystem::path current_path = std::filesystem::current_path();
  return current_path.string();
}

time_t get_file_changed(const char* file_path) {
  struct stat fileStat;
  if (stat(file_path, &fileStat) == 0) {
    return fileStat.st_mtime;
  } else {
    return 0;
  }
}

// 函数用于检查文件是否是.dds文件
bool is_file_ext(const std::string_view& filename, const char* ext) {
  // 查找最后一个'.'的位置
  size_t lastDotPos = filename.rfind('.');
  // 检查是否找到了'.'以及它是否是文件名的最后一个字符
  if (lastDotPos != std::string::npos && lastDotPos + 1 < filename.size()) {
    // 检查文件扩展名是否为"dds"
    return filename.compare(
               lastDotPos + 1, filename.size() - lastDotPos - 1, ext) == 0;
  }
  return false; // 如果没有'.'或者'.'是最后一个字符，返回false
}

static constexpr size_t BUFFER_SIZE = 1024;

file_printer::file_printer(const char* filename) {
  buffer = new char[BUFFER_SIZE];

  file.open(filename, std::ios::out | std::ios::trunc);
  if (!file.is_open()) {
    throw std::runtime_error("Failed to open file");
  }
}

file_printer::file_printer(const std::wstring& filename) {
  buffer = new char[BUFFER_SIZE];

  file.open(filename, std::ios::out | std::ios::trunc);
  if (!file.is_open()) {
    throw std::runtime_error("Failed to open file");
  }
}

file_printer::~file_printer() {
  delete[] buffer;
  close();
}

void file_printer::print(const char* format, ...) {

  va_list args;
  va_start(args, format);
  std::vsnprintf(buffer, BUFFER_SIZE, format, args);
  va_end(args);

  file << buffer;
}

void file_printer::println(const char* format, ...) {

  va_list args;
  va_start(args, format);
  std::vsnprintf(buffer, BUFFER_SIZE, format, args);
  va_end(args);

  file << buffer << std::endl;
}

void file_printer::printv(const char* format, va_list args) {
  std::vsnprintf(buffer, BUFFER_SIZE, format, args);

  file << buffer;
}

void file_printer::close() {
  if (file.is_open()) {
    file.close();
  }
}

} // namespace ikit